#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/10/18 0:10
# @Author  : when
# @File    : utils.py
# @Description : 以下是关于浏览器两种代理解决方案，认证拓展代理（不支持无头浏览器）、非认证代理（）

import os
import zipfile

BASE_DIR = os.path.split(__file__)[0]
CHROME_PROXY_HELPER_DIR = os.path.join(BASE_DIR, "sample")


def get_chrome_ext_proxy(proxy_format: str, extensions_dir: str):
    """
    认证拓展代理（不支持无头浏览器）
    获取一个Chrome代理扩展,里面配置有指定的代理(带用户名密码认证)
    :param proxy_format: 指定的代理, 格式: username:password@ip:port
    :param extensions_dir: 代理插件存储路径
    :return:
    """
    try:
        # 提取代理的各项参数
        username = proxy_format.split("@")[0].split(":")[0]
        password = proxy_format.split("@")[0].split(":")[-1]
        ip = proxy_format.split("@")[-1].split(":")[0]
        port = proxy_format.split("@")[-1].split(":")[-1]
    except Exception:
        raise Exception('Invalid proxy format. Should be username:password@ip:port')

    # 创建一个定制Chrome代理扩展(zip文件)
    if not os.path.exists(extensions_dir):
        os.mkdir(extensions_dir)
    extension_file_path = os.path.join(extensions_dir, f"proxy_{ip}_{port}.zip")
    if os.path.exists(extension_file_path):
        os.remove(extension_file_path)
    # 扩展文件不存在，创建
    zf = zipfile.ZipFile(extension_file_path, mode='w')
    zf.write(os.path.join(CHROME_PROXY_HELPER_DIR, 'manifest.json'), 'manifest.json')
    # 替换模板中的代理参数
    background_content = open(os.path.join(CHROME_PROXY_HELPER_DIR, 'background.js')).read()
    background_content = background_content.replace('%proxy_host', ip)
    background_content = background_content.replace('%proxy_port', port)
    background_content = background_content.replace('%username', username)
    background_content = background_content.replace('%password', password)
    zf.writestr('background.js', background_content)
    zf.close()
    return extension_file_path
